{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import utils\n",
    "import matplotlib\n",
    "import matplotlib.pyplot as plt\n",
    "from mpl_toolkits.mplot3d import Axes3D\n",
    "from matplotlib import colors\n",
    "%matplotlib inline\n",
    "from IPython.display import set_matplotlib_formats\n",
    "set_matplotlib_formats('png', 'pdf')\n",
    "plt.rc('font', size=14)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "frequency_multipliers = 2**np.arange(3,8)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## No spacing, large time step"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Frequency multiplier 8\n",
      "Frequency multiplier 16\n",
      "Frequency multiplier 32\n",
      "Frequency multiplier 64\n",
      "Frequency multiplier 128\n"
     ]
    }
   ],
   "source": [
    "downsample_errors = np.zeros(frequency_multipliers.shape)\n",
    "downsample_matrix_size = np.zeros((frequency_multipliers.size,2))\n",
    "\n",
    "for fm_idx,frequency_multiplier in enumerate(frequency_multipliers):\n",
    "    print(\"Frequency multiplier %d\" % frequency_multiplier)\n",
    "\n",
    "    mu1=5\n",
    "    mu2=5\n",
    "    c1 = 0\n",
    "    c2 = 0\n",
    "    tau1=.2\n",
    "    tau2=tau1*frequency_multiplier\n",
    "\n",
    "    x0=[0.0,2.0,2.0,0.0]\n",
    "    \n",
    "    fast_period_length = 11.45015*tau1\n",
    "    slow_period_length = fast_period_length*frequency_multiplier\n",
    "\n",
    "    num_periods_simulate = 10\n",
    "    sampling_rate_simulate = 2048\n",
    "    t_simulate = np.linspace(0, num_periods_simulate*slow_period_length,\n",
    "                    int(num_periods_simulate*sampling_rate_simulate*slow_period_length/fast_period_length))\n",
    "    dt_simulate = t_simulate[1]-t_simulate[0]\n",
    "\n",
    "    initial_samples = int(5*sampling_rate_simulate)\n",
    "    vdp_simulation = utils.simulate_coupled_vdp(dt_simulate, t_simulate.size+initial_samples, x0=x0,\n",
    "                                              mu1=mu1, mu2=mu2, c1=c1, c2=c2, tau1=tau1, tau2=tau2)[0]\n",
    "    vdp_solution = vdp_simulation[:,initial_samples:]\n",
    "    coupled_solution = vdp_solution[0:1] + vdp_solution[2:3]\n",
    "    \n",
    "    num_periods_subsample = 5\n",
    "    sampling_rate_subsample = 1024//frequency_multiplier\n",
    "\n",
    "    t_max_idx = int(num_periods_subsample*slow_period_length/dt_simulate)+2\n",
    "    spacing = sampling_rate_simulate//sampling_rate_subsample\n",
    "\n",
    "    t_sample = t_simulate[:t_max_idx:spacing]\n",
    "    dt_sample = t_sample[1] - t_sample[0]\n",
    "\n",
    "    sampled_data = coupled_solution[:,:t_max_idx:spacing]\n",
    "\n",
    "    time_delay=sampling_rate_subsample*frequency_multiplier\n",
    "    time_delay_spacing=1\n",
    "    rank=100\n",
    "    \n",
    "    sample_spacing=1\n",
    "    dt_scaling=1\n",
    "\n",
    "    dmd = utils.DMD(truncation='hard', threshold=rank, time_delay=time_delay, time_delay_spacing=time_delay_spacing)\n",
    "    dmd.fit(sampled_data, dt_sample, sample_spacing=sample_spacing, dt_scale=dt_scaling)\n",
    "    dmd_reconstruction = dmd.reconstruct(t_simulate, imaginary_evals=True)\n",
    "\n",
    "    error = np.mean((coupled_solution[0] - dmd_reconstruction[0])**2)\n",
    "    downsample_errors[fm_idx] = error\n",
    "    downsample_matrix_size[fm_idx] = utils.hankel_matrix(sampled_data, time_delay,\n",
    "                                                    spacing=time_delay_spacing)[:,dt_scaling::sample_spacing].shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## No spacing, small time step"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Frequency multiplier 8\n",
      "Frequency multiplier 16\n",
      "Frequency multiplier 32\n",
      "Frequency multiplier 64\n",
      "Frequency multiplier 128\n"
     ]
    }
   ],
   "source": [
    "nospacing_errors = np.zeros(frequency_multipliers.shape)\n",
    "nospacing_matrix_size = np.zeros((frequency_multipliers.size,2))\n",
    "\n",
    "for fm_idx,frequency_multiplier in enumerate(frequency_multipliers):\n",
    "    print(\"Frequency multiplier %d\" % frequency_multiplier)\n",
    "\n",
    "    mu1=5\n",
    "    mu2=5\n",
    "    c1 = 0\n",
    "    c2 = 0\n",
    "    tau1=.2\n",
    "    tau2=tau1*frequency_multiplier\n",
    "\n",
    "    x0=[0.0,2.0,2.0,0.0]\n",
    "    \n",
    "    fast_period_length = 11.45015*tau1\n",
    "    slow_period_length = fast_period_length*frequency_multiplier\n",
    "\n",
    "    num_periods_simulate = 10\n",
    "    sampling_rate_simulate = 2048\n",
    "    t_simulate = np.linspace(0, num_periods_simulate*slow_period_length,\n",
    "                    int(num_periods_simulate*sampling_rate_simulate*slow_period_length/fast_period_length))\n",
    "    dt_simulate = t_simulate[1]-t_simulate[0]\n",
    "\n",
    "    initial_samples = int(5*sampling_rate_simulate)\n",
    "    vdp_simulation = utils.simulate_coupled_vdp(dt_simulate, t_simulate.size+initial_samples, x0=x0,\n",
    "                                              mu1=mu1, mu2=mu2, c1=c1, c2=c2, tau1=tau1, tau2=tau2)[0]\n",
    "    vdp_solution = vdp_simulation[:,initial_samples:]\n",
    "    coupled_solution = vdp_solution[0:1] + vdp_solution[2:3]\n",
    "    \n",
    "    num_periods_subsample = 5\n",
    "    sampling_rate_subsample = 64\n",
    "\n",
    "    t_max_idx = int(num_periods_subsample*slow_period_length/dt_simulate)+2\n",
    "    spacing = sampling_rate_simulate//sampling_rate_subsample\n",
    "\n",
    "    t_sample = t_simulate[:t_max_idx:spacing]\n",
    "    dt_sample = t_sample[1] - t_sample[0]\n",
    "\n",
    "    sampled_data = coupled_solution[:,:t_max_idx:spacing]\n",
    "\n",
    "    time_delay=sampling_rate_subsample*frequency_multiplier\n",
    "    time_delay_spacing=1\n",
    "    rank=100\n",
    "    \n",
    "    sample_spacing=1\n",
    "    dt_scaling=1\n",
    "\n",
    "    dmd = utils.DMD(truncation='hard', threshold=rank, time_delay=time_delay, time_delay_spacing=time_delay_spacing)\n",
    "    dmd.fit(sampled_data, dt_sample, sample_spacing=sample_spacing, dt_scale=dt_scaling)\n",
    "    dmd_reconstruction = dmd.reconstruct(t_simulate, imaginary_evals=True)\n",
    "\n",
    "    error = np.mean((coupled_solution[0] - dmd_reconstruction[0])**2)\n",
    "    nospacing_errors[fm_idx] = error\n",
    "    nospacing_matrix_size[fm_idx] = utils.hankel_matrix(sampled_data, time_delay,\n",
    "                                                    spacing=time_delay_spacing)[:,dt_scaling::sample_spacing].shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Space out rows and columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Frequency multiplier 8\n",
      "Frequency multiplier 16\n",
      "Frequency multiplier 32\n",
      "Frequency multiplier 64\n",
      "Frequency multiplier 128\n"
     ]
    }
   ],
   "source": [
    "fullspacing_errors = np.zeros(frequency_multipliers.shape)\n",
    "fullspacing_matrix_size = np.zeros((frequency_multipliers.size,2))\n",
    "\n",
    "for fm_idx,frequency_multiplier in enumerate(frequency_multipliers):\n",
    "    print(\"Frequency multiplier %d\" % frequency_multiplier)\n",
    "\n",
    "    mu1=5\n",
    "    mu2=5\n",
    "    c1 = 0\n",
    "    c2 = 0\n",
    "    tau1=.2\n",
    "    tau2=tau1*frequency_multiplier\n",
    "\n",
    "    x0=[0.0,2.0,2.0,0.0]\n",
    "    \n",
    "    fast_period_length = 11.45015*tau1\n",
    "    slow_period_length = fast_period_length*frequency_multiplier\n",
    "\n",
    "    num_periods_simulate = 10\n",
    "    sampling_rate_simulate = 2048\n",
    "    t_simulate = np.linspace(0, num_periods_simulate*slow_period_length,\n",
    "                    int(num_periods_simulate*sampling_rate_simulate*slow_period_length/fast_period_length))\n",
    "    dt_simulate = t_simulate[1]-t_simulate[0]\n",
    "\n",
    "    initial_samples = int(5*sampling_rate_simulate)\n",
    "    vdp_simulation = utils.simulate_coupled_vdp(dt_simulate, t_simulate.size+initial_samples, x0=x0,\n",
    "                                              mu1=mu1, mu2=mu2, c1=c1, c2=c2, tau1=tau1, tau2=tau2)[0]\n",
    "    vdp_solution = vdp_simulation[:,initial_samples:]\n",
    "    coupled_solution = vdp_solution[0:1] + vdp_solution[2:3]\n",
    "    \n",
    "    num_periods_subsample = 5\n",
    "    sampling_rate_subsample = 256\n",
    "\n",
    "    t_max_idx = int(num_periods_subsample*slow_period_length/dt_simulate)+2\n",
    "    spacing = sampling_rate_simulate//sampling_rate_subsample\n",
    "\n",
    "    t_sample = t_simulate[:t_max_idx:spacing]\n",
    "    dt_sample = t_sample[1] - t_sample[0]\n",
    "\n",
    "    sampled_data = coupled_solution[:,:t_max_idx:spacing]\n",
    "\n",
    "    time_delay=sampling_rate_subsample\n",
    "    time_delay_spacing=frequency_multiplier\n",
    "    rank=100\n",
    "    \n",
    "    sample_spacing=frequency_multiplier//frequency_multipliers[0]\n",
    "    dt_scaling=4\n",
    "\n",
    "    dmd = utils.DMD(truncation='hard', threshold=rank, time_delay=time_delay, time_delay_spacing=time_delay_spacing)\n",
    "    dmd.fit(sampled_data, dt_sample, sample_spacing=sample_spacing, dt_scale=dt_scaling)\n",
    "    dmd_reconstruction = dmd.reconstruct(t_simulate, imaginary_evals=True)\n",
    "\n",
    "    error = np.mean((coupled_solution[0,t_max_idx:] - dmd_reconstruction[0,t_max_idx:])**2)\n",
    "    fullspacing_errors[fm_idx] = error\n",
    "    fullspacing_matrix_size[fm_idx] = utils.hankel_matrix(sampled_data, time_delay,\n",
    "                                                    spacing=time_delay_spacing)[:,dt_scaling::sample_spacing].shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Plot results\n",
    "\n",
    "## Snapshot matrix size"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/pdf": "JVBERi0xLjQKJazcIKu6CjEgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL1BhZ2VzIDIgMCBSID4+\nCmVuZG9iago4IDAgb2JqCjw8IC9Gb250IDMgMCBSIC9YT2JqZWN0IDcgMCBSIC9FeHRHU3RhdGUg\nNCAwIFIgL1BhdHRlcm4gNSAwIFIKL1NoYWRpbmcgNiAwIFIgL1Byb2NTZXQgWyAvUERGIC9UZXh0\nIC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJIF0gPj4KZW5kb2JqCjEwIDAgb2JqCjw8IC9UeXBlIC9Q\nYWdlIC9QYXJlbnQgMiAwIFIgL1Jlc291cmNlcyA4IDAgUgovTWVkaWFCb3ggWyAwIDAgMTk5Ljcw\nNTU0Njg3NSAxNTkuNTYgXSAvQ29udGVudHMgOSAwIFIKL0dyb3VwIDw8IC9UeXBlIC9Hcm91cCAv\nUyAvVHJhbnNwYXJlbmN5IC9DUyAvRGV2aWNlUkdCID4+IC9Bbm5vdHMgWyBdID4+CmVuZG9iago5\nIDAgb2JqCjw8IC9MZW5ndGggMTEgMCBSIC9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4\nnL2Xu24dNxCG+30Klk4RinPjpYzgRICBFEoEpAhcybJswXLgGIheP//uaslZRUc6KqJCl/Ofj7Mz\nnAu5FG6mk58oXH8PKdzg5y78Gd7j74dA4SycvL365/Pl1W9np+Hy+5Sg307UWizJTAs+fvEfyVq0\nDC2Nfz9N09cJ9sGeweT1JC1y4IpfMFVbTOvaRfniFdIa62xiWdE/weBHuMyry9ewCbdjdY7PT8I3\nk+XYcmtStsc5QWOBrel0s0ThbvoGP1P4Ec4H1agLySm1QClSymzh8nY6vZi3IWqrKsXCxYfp5BeC\nd+Hi4/SGfggXN1ONLRXmbPOSNCNv0vIFQlNiSm1eaVGsORMNMQwbP19M5z3KObqJSoqppFx6OF55\nJh6yEm1GczPs4iMBSS5U/5eA+JGAMtxDWtWwnrZ4nJCXYkA4mlEOTVQ2yAkdMoqlaZFuyQkdahQT\n5Wy9+JzQIcLONOGStG+yUwbGFlMWybVjThmYwFmWlkfBO2VgqLYGf6l1zCkDM45mRNbD9IrDWoTT\nqcrAhjKwrLE29Nmw5pSOrbW3dKBwLILtWlJlqLchPFF5Ze72EtHXWYs2k1epuXygiZZACuKtVTVv\n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\nlgophlxAPoiVywUTywGzzCzMgSwjC5CWHC5DC2MwbWJspGBmYgZkWSAxILrSAHL4EpEKZW5kc3Ry\nZWFtCmVuZG9iagoyNCAwIG9iago8PCAvTGVuZ3RoIDM5MiAvRmlsdGVyIC9GbGF0ZURlY29kZSA+\nPgpzdHJlYW0KeJw9UktuBTEI288puECl8E1ynqne7t1/W5vMVKoKLwO2MZSXDKklP+qSiDNMfvVy\nXeJR8r1samfmIe4uNqb4WHJfuobYctGaYrFPHMkvyLRUWKFW3aND8YUoEw8ALeCBBeG+HP/xF6jB\n17CFcsN7ZAJgStRuQMZD0RlIWUERYfuRFeikUK9s4e8oIFfUrIWhdGKIDZYAKb6rDYmYqNmgh4SV\nkqod0vGMpPBbwV2JYVBbW9sEeGbQENnekY0RM+3RGXFZEWs/PemjUTK1URkPTWd88d0yUvPRFeik\n0sjdykNnz0InYCTmSZjncCPhnttBCzH0ca+WT2z3mClWkfAFO8oBA7393pKNz3vgLIxc2+xMJ/DR\naaccE62+HmL9gz9sS5tcxyuHRRSovCgIftdBE3F8WMX3ZKNEd7QB1iMT1WglEAwSws7tMPJ4xnnZ\n3hW05vREaKNEHtSOET0ossXlnBWwp/yszbEcng8me2+0j5TMzKiEFdR2eqi2z2Md1Hee+/r8AS4A\noRkKZW5kc3RyZWFtCmVuZG9iagoxNyAwIG9iago8PCAvVHlwZSAvRm9udCAvQmFzZUZvbnQgL0Rl\namFWdVNhbnMgL0ZpcnN0Q2hhciAwIC9MYXN0Q2hhciAyNTUKL0ZvbnREZXNjcmlwdG9yIDE2IDAg\nUiAvU3VidHlwZSAvVHlwZTMgL05hbWUgL0RlamFWdVNhbnMKL0ZvbnRCQm94IFsgLTEwMjEgLTQ2\nMyAxNzk0IDEyMzMgXSAvRm9udE1hdHJpeCBbIDAuMDAxIDAgMCAwLjAwMSAwIDAgXQovQ2hhclBy\nb2NzIDE4IDAgUgovRW5jb2RpbmcgPDwgL1R5cGUgL0VuY29kaW5nCi9EaWZmZXJlbmNlcyBbIDQ4\nIC96ZXJvIC9vbmUgL3R3byA1NCAvc2l4IC9zZXZlbiAvZWlnaHQgXSA+PgovV2lkdGhzIDE1IDAg\nUiA+PgplbmRvYmoKMTYgMCBvYmoKPDwgL1R5cGUgL0ZvbnREZXNjcmlwdG9yIC9Gb250TmFtZSAv\nRGVqYVZ1U2FucyAvRmxhZ3MgMzIKL0ZvbnRCQm94IFsgLTEwMjEgLTQ2MyAxNzk0IDEyMzMgXSAv\nQXNjZW50IDkyOSAvRGVzY2VudCAtMjM2IC9DYXBIZWlnaHQgMAovWEhlaWdodCAwIC9JdGFsaWNB\nbmdsZSAwIC9TdGVtViAwIC9NYXhXaWR0aCAxMzQyID4+CmVuZG9iagoxNSAwIG9iagpbIDYwMCA2\nMDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYw\nMCA2MDAgNjAwCjYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAw\nIDYwMCA2MDAgMzE4IDQwMSA0NjAgODM4IDYzNgo5NTAgNzgwIDI3NSAzOTAgMzkwIDUwMCA4Mzgg\nMzE4IDM2MSAzMTggMzM3IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYKNjM2IDYzNiAz\nMzcgMzM3IDgzOCA4MzggODM4IDUzMSAxMDAwIDY4NCA2ODYgNjk4IDc3MCA2MzIgNTc1IDc3NSA3\nNTIgMjk1CjI5NSA2NTYgNTU3IDg2MyA3NDggNzg3IDYwMyA3ODcgNjk1IDYzNSA2MTEgNzMyIDY4\nNCA5ODkgNjg1IDYxMSA2ODUgMzkwIDMzNwozOTAgODM4IDUwMCA1MDAgNjEzIDYzNSA1NTAgNjM1\nIDYxNSAzNTIgNjM1IDYzNCAyNzggMjc4IDU3OSAyNzggOTc0IDYzNCA2MTIKNjM1IDYzNSA0MTEg\nNTIxIDM5MiA2MzQgNTkyIDgxOCA1OTIgNTkyIDUyNSA2MzYgMzM3IDYzNiA4MzggNjAwIDYzNiA2\nMDAgMzE4CjM1MiA1MTggMTAwMCA1MDAgNTAwIDUwMCAxMzQyIDYzNSA0MDAgMTA3MCA2MDAgNjg1\nIDYwMCA2MDAgMzE4IDMxOCA1MTggNTE4CjU5MCA1MDAgMTAwMCA1MDAgMTAwMCA1MjEgNDAwIDEw\nMjMgNjAwIDUyNSA2MTEgMzE4IDQwMSA2MzYgNjM2IDYzNiA2MzYgMzM3CjUwMCA1MDAgMTAwMCA0\nNzEgNjEyIDgzOCAzNjEgMTAwMCA1MDAgNTAwIDgzOCA0MDEgNDAxIDUwMCA2MzYgNjM2IDMxOCA1\nMDAKNDAxIDQ3MSA2MTIgOTY5IDk2OSA5NjkgNTMxIDY4NCA2ODQgNjg0IDY4NCA2ODQgNjg0IDk3\nNCA2OTggNjMyIDYzMiA2MzIgNjMyCjI5NSAyOTUgMjk1IDI5NSA3NzUgNzQ4IDc4NyA3ODcgNzg3\nIDc4NyA3ODcgODM4IDc4NyA3MzIgNzMyIDczMiA3MzIgNjExIDYwNQo2MzAgNjEzIDYxMyA2MTMg\nNjEzIDYxMyA2MTMgOTgyIDU1MCA2MTUgNjE1IDYxNSA2MTUgMjc4IDI3OCAyNzggMjc4IDYxMiA2\nMzQKNjEyIDYxMiA2MTIgNjEyIDYxMiA4MzggNjEyIDYzNCA2MzQgNjM0IDYzNCA1OTIgNjM1IDU5\nMiBdCmVuZG9iagoxOCAwIG9iago8PCAvemVybyAxOSAwIFIgL29uZSAyMCAwIFIgL3R3byAyMSAw\nIFIgL3NpeCAyMiAwIFIgL3NldmVuIDIzIDAgUgovZWlnaHQgMjQgMCBSID4+CmVuZG9iagozIDAg\nb2JqCjw8IC9GMSAxNyAwIFIgPj4KZW5kb2JqCjQgMCBvYmoKPDwgL0ExIDw8IC9UeXBlIC9FeHRH\nU3RhdGUgL0NBIDAgL2NhIDEgPj4KL0EyIDw8IC9UeXBlIC9FeHRHU3RhdGUgL0NBIDEgL2NhIDEg\nPj4gPj4KZW5kb2JqCjUgMCBvYmoKPDwgPj4KZW5kb2JqCjYgMCBvYmoKPDwgPj4KZW5kb2JqCjcg\nMCBvYmoKPDwgL00wIDEyIDAgUiAvTTEgMTMgMCBSIC9NMiAxNCAwIFIgPj4KZW5kb2JqCjEyIDAg\nb2JqCjw8IC9UeXBlIC9YT2JqZWN0IC9TdWJ0eXBlIC9Gb3JtIC9CQm94IFsgLTIgLTIgMiAyIF0g\nL0xlbmd0aCAxMzMKL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCnicbZA5DgMhDEV7n4IL\nfGSLAEM7Za5BE0Wa+7cTQwARp7G8/edF3JvYPeljID66i9iHkg+OPWafcwlZg/CQEsWJ58QpaaY7\nlWYNo12lmKQGan0KnMmvaGk6b3FXZbZuRLWV9jkwIlgwzHBsu2FsjP0Q2Evx5x+wX8MvG335F9FJ\nN6PLSPoKZW5kc3RyZWFtCmVuZG9iagoxMyAwIG9iago8PCAvVHlwZSAvWE9iamVjdCAvU3VidHlw\nZSAvRm9ybSAvQkJveCBbIC0yIC0yIDIgMiBdIC9MZW5ndGggMTMzCi9GaWx0ZXIgL0ZsYXRlRGVj\nb2RlID4+CnN0cmVhbQp4nG2QOQ4DIQxFe5+CC3xkiwBDO2WuQRNFmvu3E0MAEaexvP3nRdyb2D3p\nYyA+uovYh5IPjj1mn3MJWYPwkBLFiefEKWmmO5VmDaNdpZikBmp9CpzJr2hpOm9xV2W2bkS1lfY5\nMCJYMMxwbLthbIz9ENhL8ecfsF/DLxt9+RfRSTejy0j6CmVuZHN0cmVhbQplbmRvYmoKMTQgMCBv\nYmoKPDwgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0Zvcm0gL0JCb3ggWyAtMiAtMiAyIDIgXSAv\nTGVuZ3RoIDEzMwovRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJxtkDkOAyEMRXufggt8\nZIsAQztlrkETRZr7txNDABGnsbz950Xcm9g96WMgPrqL2IeSD449Zp9zCVmD8JASxYnnxClppjuV\nZg2jXaWYpAZqfQqcya9oaTpvcVdltm5EtZX2OTAiWDDMcGy7YWyM/RDYS/HnH7Bfwy8bffkX0Uk3\no8tI+gplbmRzdHJlYW0KZW5kb2JqCjIgMCBvYmoKPDwgL1R5cGUgL1BhZ2VzIC9LaWRzIFsgMTAg\nMCBSIF0gL0NvdW50IDEgPj4KZW5kb2JqCjI1IDAgb2JqCjw8IC9DcmVhdG9yIChtYXRwbG90bGli\nIDIuMC4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcpCi9Qcm9kdWNlciAobWF0cGxvdGxpYiBwZGYg\nYmFja2VuZCkgL0NyZWF0aW9uRGF0ZSAoRDoyMDE4MDYwNzA5MDQyNi0wNycwMCcpCj4+CmVuZG9i\nagp4cmVmCjAgMjYKMDAwMDAwMDAwMCA2NTUzNSBmIAowMDAwMDAwMDE2IDAwMDAwIG4gCjAwMDAw\nMDU5NTAgMDAwMDAgbiAKMDAwMDAwNDk1NSAwMDAwMCBuIAowMDAwMDA0OTg3IDAwMDAwIG4gCjAw\nMDAwMDUwODYgMDAwMDAgbiAKMDAwMDAwNTEwNyAwMDAwMCBuIAowMDAwMDA1MTI4IDAwMDAwIG4g\nCjAwMDAwMDAwNjUgMDAwMDAgbiAKMDAwMDAwMDM5OCAwMDAwMCBuIAowMDAwMDAwMjA4IDAwMDAw\nIG4gCjAwMDAwMDE0OTcgMDAwMDAgbiAKMDAwMDAwNTE4MiAwMDAwMCBuIAowMDAwMDA1NDM4IDAw\nMDAwIG4gCjAwMDAwMDU2OTQgMDAwMDAgbiAKMDAwMDAwMzgwMyAwMDAwMCBuIAowMDAwMDAzNjAz\nIDAwMDAwIG4gCjAwMDAwMDMyNjkgMDAwMDAgbiAKMDAwMDAwNDg1NiAwMDAwMCBuIAowMDAwMDAx\nNTE4IDAwMDAwIG4gCjAwMDAwMDE4MDEgMDAwMDAgbiAKMDAwMDAwMTk1MyAwMDAwMCBuIAowMDAw\nMDAyMjc0IDAwMDAwIG4gCjAwMDAwMDI2NjQgMDAwMDAgbiAKMDAwMDAwMjgwNCAwMDAwMCBuIAow\nMDAwMDA2MDEwIDAwMDAwIG4gCnRyYWlsZXIKPDwgL1NpemUgMjYgL1Jvb3QgMSAwIFIgL0luZm8g\nMjUgMCBSID4+CnN0YXJ0eHJlZgo2MTU4CiUlRU9GCg==\n",
      "image/png": "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\nB2jAnHXQgPm0AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f2e4a374e10>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(3,2.5))\n",
    "plt.loglog(frequency_multipliers, nospacing_matrix_size[:,0]*nospacing_matrix_size[:,1], '.-k', linewidth=2)\n",
    "plt.loglog(frequency_multipliers, downsample_matrix_size[:,0]*downsample_matrix_size[:,1], '.--k', linewidth=2)\n",
    "plt.loglog(frequency_multipliers, fullspacing_matrix_size[:,0]*fullspacing_matrix_size[:,1], '.:k', linewidth=2)\n",
    "plt.tight_layout()\n",
    "# plt.savefig('figures/05b_spacing_scaling.pdf', format='pdf', dpi=300)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Error"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/pdf": "JVBERi0xLjQKJazcIKu6CjEgMCBvYmoKPDwgL1R5cGUgL0NhdGFsb2cgL1BhZ2VzIDIgMCBSID4+\nCmVuZG9iago4IDAgb2JqCjw8IC9Gb250IDMgMCBSIC9YT2JqZWN0IDcgMCBSIC9FeHRHU3RhdGUg\nNCAwIFIgL1BhdHRlcm4gNSAwIFIKL1NoYWRpbmcgNiAwIFIgL1Byb2NTZXQgWyAvUERGIC9UZXh0\nIC9JbWFnZUIgL0ltYWdlQyAvSW1hZ2VJIF0gPj4KZW5kb2JqCjEwIDAgb2JqCjw8IC9UeXBlIC9Q\nYWdlIC9QYXJlbnQgMiAwIFIgL1Jlc291cmNlcyA4IDAgUgovTWVkaWFCb3ggWyAwIDAgMjA2Ljc3\nMjM0Mzc1IDE1OS41NiBdIC9Db250ZW50cyA5IDAgUgovR3JvdXAgPDwgL1R5cGUgL0dyb3VwIC9T\nIC9UcmFuc3BhcmVuY3kgL0NTIC9EZXZpY2VSR0IgPj4gL0Fubm90cyBbIF0gPj4KZW5kb2JqCjkg\nMCBvYmoKPDwgL0xlbmd0aCAxMSAwIFIgL0ZpbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCnic\nvVfBbhw3DL3rK3RMD5ZFipTEY420BgL0kGbRHoIeAsdxY2RduEbq3++TZndGa3g9dtP2YO8s94ki\n36NIDflrd/o9+as7H/01/u79e/8bPj968uf+9PXlX58vLn8+P/MXdy7CvnUccyiFkwi+fhm/klrQ\nDFtcHn937sbBP7DncHnlpAT2XPFv68hyiNPabvkyWkhqqM1FXzF/g8NPCJmnkK/gE2GHOgTedsIv\nLkuoaiy0324wSCjw5c72nsjfu1vEGf0JgvfKITVkzJzJUwyEJ/UXW3e2aTQEsSqpqN98dKc/AiF+\n88m9ou/85trVYEiBs7YlsUFexf6DhSjEFK2t1LbD4MKQw+Ljh417O2fZsnNUQIOqcJnZGywr+RBS\nLx3KReyxhFIuVP+ThPiRhDLCg6witeosz2DIvRiQjqZgORv23YEGwwKyUChzSTNoMcwgqyFbqln2\noMEwg4hqkKp13m4wLKDEQbki1Bk1WBaYpCAca5x3HC0LrNUaRykLbLAMMPApGtOy6WBZYDlDykQ0\nszpaFljhQMSSl1qaDTNoqrt++sA6a65gHTIl1NpieKLq2kosL9FMkU765gNEreBZk/XiPVZwui+4\n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\nigMX8dlhrxxghdLFmuR9QCoTemD6/9f4ef78Axy2gFQKZW5kc3RyZWFtCmVuZG9iagoyNCAwIG9i\nago8PCAvTGVuZ3RoIDI0NyAvRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0KeJxNUbttRDEM\n698UXOAA62t5ngtSXfZvQ8kIkMIgoS8ppyUW9sZLDOEHWw++5JFVQ38ePzHsMyw9yeTUP+a5yVQU\nvhWqm5hQF2Lh/WgEvBZ0LyIrygffj2UMc8734KMQl2AmNGCsb0kmF9W8M2TCiaGOw0GbVBh3TRQs\nrhXNM8jtVjeyOrMgbHglE+LGAEQE2ReQzWCjjLGVkMVyHqgKkgVaYNfpG1GLgiuU1gl0otbEuszg\nq+f2djdDL/LgqLp4fQzrS7DC6KV7LHyuQh/M9Ew7d0kjvfCmExFmDwVSmZ2RlTo9Yn23QP+fZSv4\n+8nP8/0LFShcKgplbmRzdHJlYW0KZW5kb2JqCjE3IDAgb2JqCjw8IC9UeXBlIC9Gb250IC9CYXNl\nRm9udCAvRGVqYVZ1U2FucyAvRmlyc3RDaGFyIDAgL0xhc3RDaGFyIDI1NQovRm9udERlc2NyaXB0\nb3IgMTYgMCBSIC9TdWJ0eXBlIC9UeXBlMyAvTmFtZSAvRGVqYVZ1U2FucwovRm9udEJCb3ggWyAt\nMTAyMSAtNDYzIDE3OTQgMTIzMyBdIC9Gb250TWF0cml4IFsgMC4wMDEgMCAwIDAuMDAxIDAgMCBd\nCi9DaGFyUHJvY3MgMTggMCBSCi9FbmNvZGluZyA8PCAvVHlwZSAvRW5jb2RpbmcgL0RpZmZlcmVu\nY2VzIFsgNDggL3plcm8gL29uZSAvdHdvIC90aHJlZSA1MyAvZml2ZSBdID4+Ci9XaWR0aHMgMTUg\nMCBSID4+CmVuZG9iagoxNiAwIG9iago8PCAvVHlwZSAvRm9udERlc2NyaXB0b3IgL0ZvbnROYW1l\nIC9EZWphVnVTYW5zIC9GbGFncyAzMgovRm9udEJCb3ggWyAtMTAyMSAtNDYzIDE3OTQgMTIzMyBd\nIC9Bc2NlbnQgOTI5IC9EZXNjZW50IC0yMzYgL0NhcEhlaWdodCAwCi9YSGVpZ2h0IDAgL0l0YWxp\nY0FuZ2xlIDAgL1N0ZW1WIDAgL01heFdpZHRoIDEzNDIgPj4KZW5kb2JqCjE1IDAgb2JqClsgNjAw\nIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAg\nNjAwIDYwMCA2MDAKNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2MDAgNjAwIDYwMCA2\nMDAgNjAwIDYwMCAzMTggNDAxIDQ2MCA4MzggNjM2Cjk1MCA3ODAgMjc1IDM5MCAzOTAgNTAwIDgz\nOCAzMTggMzYxIDMxOCAzMzcgNjM2IDYzNiA2MzYgNjM2IDYzNiA2MzYgNjM2IDYzNgo2MzYgNjM2\nIDMzNyAzMzcgODM4IDgzOCA4MzggNTMxIDEwMDAgNjg0IDY4NiA2OTggNzcwIDYzMiA1NzUgNzc1\nIDc1MiAyOTUKMjk1IDY1NiA1NTcgODYzIDc0OCA3ODcgNjAzIDc4NyA2OTUgNjM1IDYxMSA3MzIg\nNjg0IDk4OSA2ODUgNjExIDY4NSAzOTAgMzM3CjM5MCA4MzggNTAwIDUwMCA2MTMgNjM1IDU1MCA2\nMzUgNjE1IDM1MiA2MzUgNjM0IDI3OCAyNzggNTc5IDI3OCA5NzQgNjM0IDYxMgo2MzUgNjM1IDQx\nMSA1MjEgMzkyIDYzNCA1OTIgODE4IDU5MiA1OTIgNTI1IDYzNiAzMzcgNjM2IDgzOCA2MDAgNjM2\nIDYwMCAzMTgKMzUyIDUxOCAxMDAwIDUwMCA1MDAgNTAwIDEzNDIgNjM1IDQwMCAxMDcwIDYwMCA2\nODUgNjAwIDYwMCAzMTggMzE4IDUxOCA1MTgKNTkwIDUwMCAxMDAwIDUwMCAxMDAwIDUyMSA0MDAg\nMTAyMyA2MDAgNTI1IDYxMSAzMTggNDAxIDYzNiA2MzYgNjM2IDYzNiAzMzcKNTAwIDUwMCAxMDAw\nIDQ3MSA2MTIgODM4IDM2MSAxMDAwIDUwMCA1MDAgODM4IDQwMSA0MDEgNTAwIDYzNiA2MzYgMzE4\nIDUwMAo0MDEgNDcxIDYxMiA5NjkgOTY5IDk2OSA1MzEgNjg0IDY4NCA2ODQgNjg0IDY4NCA2ODQg\nOTc0IDY5OCA2MzIgNjMyIDYzMiA2MzIKMjk1IDI5NSAyOTUgMjk1IDc3NSA3NDggNzg3IDc4NyA3\nODcgNzg3IDc4NyA4MzggNzg3IDczMiA3MzIgNzMyIDczMiA2MTEgNjA1CjYzMCA2MTMgNjEzIDYx\nMyA2MTMgNjEzIDYxMyA5ODIgNTUwIDYxNSA2MTUgNjE1IDYxNSAyNzggMjc4IDI3OCAyNzggNjEy\nIDYzNAo2MTIgNjEyIDYxMiA2MTIgNjEyIDgzOCA2MTIgNjM0IDYzNCA2MzQgNjM0IDU5MiA2MzUg\nNTkyIF0KZW5kb2JqCjE4IDAgb2JqCjw8IC96ZXJvIDE5IDAgUiAvb25lIDIwIDAgUiAvdHdvIDIx\nIDAgUiAvdGhyZWUgMjMgMCBSIC9maXZlIDI0IDAgUiA+PgplbmRvYmoKMyAwIG9iago8PCAvRjEg\nMTcgMCBSID4+CmVuZG9iago0IDAgb2JqCjw8IC9BMSA8PCAvVHlwZSAvRXh0R1N0YXRlIC9DQSAw\nIC9jYSAxID4+Ci9BMiA8PCAvVHlwZSAvRXh0R1N0YXRlIC9DQSAxIC9jYSAxID4+ID4+CmVuZG9i\nago1IDAgb2JqCjw8ID4+CmVuZG9iago2IDAgb2JqCjw8ID4+CmVuZG9iago3IDAgb2JqCjw8IC9N\nMCAxMiAwIFIgL00xIDEzIDAgUiAvTTIgMTQgMCBSIC9EZWphVnVTYW5zLW1pbnVzIDIyIDAgUiA+\nPgplbmRvYmoKMTIgMCBvYmoKPDwgL1R5cGUgL1hPYmplY3QgL1N1YnR5cGUgL0Zvcm0gL0JCb3gg\nWyAtMiAtMiAyIDIgXSAvTGVuZ3RoIDEzMwovRmlsdGVyIC9GbGF0ZURlY29kZSA+PgpzdHJlYW0K\neJxtkDkOAyEMRXufggt8ZIsAQztlrkETRZr7txNDABGnsbz950Xcm9g96WMgPrqL2IeSD449Zp9z\nCVmD8JASxYnnxClppjuVZg2jXaWYpAZqfQqcya9oaTpvcVdltm5EtZX2OTAiWDDMcGy7YWyM/RDY\nS/HnH7Bfwy8bffkX0Uk3o8tI+gplbmRzdHJlYW0KZW5kb2JqCjEzIDAgb2JqCjw8IC9UeXBlIC9Y\nT2JqZWN0IC9TdWJ0eXBlIC9Gb3JtIC9CQm94IFsgLTIgLTIgMiAyIF0gL0xlbmd0aCAxMzMKL0Zp\nbHRlciAvRmxhdGVEZWNvZGUgPj4Kc3RyZWFtCnicbZA5DgMhDEV7n4ILfGSLAEM7Za5BE0Wa+7cT\nQwARp7G8/edF3JvYPeljID66i9iHkg+OPWafcwlZg/CQEsWJ58QpaaY7lWYNo12lmKQGan0KnMmv\naGk6b3FXZbZuRLWV9jkwIlgwzHBsu2FsjP0Q2Evx5x+wX8MvG335F9FJN6PLSPoKZW5kc3RyZWFt\nCmVuZG9iagoxNCAwIG9iago8PCAvVHlwZSAvWE9iamVjdCAvU3VidHlwZSAvRm9ybSAvQkJveCBb\nIC0yIC0yIDIgMiBdIC9MZW5ndGggMTMzCi9GaWx0ZXIgL0ZsYXRlRGVjb2RlID4+CnN0cmVhbQp4\nnG2QOQ4DIQxFe5+CC3xkiwBDO2WuQRNFmvu3E0MAEaexvP3nRdyb2D3pYyA+uovYh5IPjj1mn3MJ\nWYPwkBLFiefEKWmmO5VmDaNdpZikBmp9CpzJr2hpOm9xV2W2bkS1lfY5MCJYMMxwbLthbIz9ENhL\n8ecfsF/DLxt9+RfRSTejy0j6CmVuZHN0cmVhbQplbmRvYmoKMiAwIG9iago8PCAvVHlwZSAvUGFn\nZXMgL0tpZHMgWyAxMCAwIFIgXSAvQ291bnQgMSA+PgplbmRvYmoKMjUgMCBvYmoKPDwgL0NyZWF0\nb3IgKG1hdHBsb3RsaWIgMi4wLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZykKL1Byb2R1Y2VyICht\nYXRwbG90bGliIHBkZiBiYWNrZW5kKSAvQ3JlYXRpb25EYXRlIChEOjIwMTgwNjA3MDkwNDMzLTA3\nJzAwJykKPj4KZW5kb2JqCnhyZWYKMCAyNgowMDAwMDAwMDAwIDY1NTM1IGYgCjAwMDAwMDAwMTYg\nMDAwMDAgbiAKMDAwMDAwNTc5MyAwMDAwMCBuIAowMDAwMDA0NzczIDAwMDAwIG4gCjAwMDAwMDQ4\nMDUgMDAwMDAgbiAKMDAwMDAwNDkwNCAwMDAwMCBuIAowMDAwMDA0OTI1IDAwMDAwIG4gCjAwMDAw\nMDQ5NDYgMDAwMDAgbiAKMDAwMDAwMDA2NSAwMDAwMCBuIAowMDAwMDAwMzk3IDAwMDAwIG4gCjAw\nMDAwMDAyMDggMDAwMDAgbiAKMDAwMDAwMTQyOSAwMDAwMCBuIAowMDAwMDA1MDI1IDAwMDAwIG4g\nCjAwMDAwMDUyODEgMDAwMDAgbiAKMDAwMDAwNTUzNyAwMDAwMCBuIAowMDAwMDAzNjM0IDAwMDAw\nIG4gCjAwMDAwMDM0MzQgMDAwMDAgbiAKMDAwMDAwMzEwNiAwMDAwMCBuIAowMDAwMDA0Njg3IDAw\nMDAwIG4gCjAwMDAwMDE0NDkgMDAwMDAgbiAKMDAwMDAwMTczMiAwMDAwMCBuIAowMDAwMDAxODg0\nIDAwMDAwIG4gCjAwMDAwMDIyMDUgMDAwMDAgbiAKMDAwMDAwMjM3NSAwMDAwMCBuIAowMDAwMDAy\nNzg2IDAwMDAwIG4gCjAwMDAwMDU4NTMgMDAwMDAgbiAKdHJhaWxlcgo8PCAvU2l6ZSAyNiAvUm9v\ndCAxIDAgUiAvSW5mbyAyNSAwIFIgPj4Kc3RhcnR4cmVmCjYwMDEKJSVFT0YK\n",
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f2de62fa9e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(3.1,2.5))\n",
    "plt.loglog(frequency_multipliers, nospacing_errors, '.-k')\n",
    "plt.loglog(frequency_multipliers, downsample_errors, '.--k')\n",
    "plt.loglog(frequency_multipliers, fullspacing_errors, '.:k')\n",
    "plt.tight_layout()\n",
    "# plt.savefig('figures/05b_spacing_errors.pdf', format='pdf', dpi=300)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
